package Serveur;

import java.io.DataInputStream;

import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.Date;
import java.util.ArrayList;
import java.util.Iterator;

import Both.*;

//randomAccessFile

public class Serialization2 {
    private static final String FICHIER_LISTE_TRANSPORT = "listeTransport.txt";
    private static final String FICHIER_LISTE_TRAJET = "listeTrajet.txt";
    private static final String FICHIER_LISTE_RESERVATION = "listeReservation.txt";

    private ObjectOutputStream ObjectOutput;
    private ObjectInputStream ObjectInput;
    private ObjectOutputStream ObjectOutput2;
    private ObjectInputStream ObjectInput2;
    private ObjectOutputStream ObjectOutput3;
    private ObjectInputStream ObjectInput3;

    private static final String CAR_SPACE = "/";
    private static final String CAR_REPLACE = "_";

    public Serialization2() {
        // initOutput();
        initInput();

    }

    /**
     * initialise les ecritures fichiers
     * 
     * @param return
     */
    public void initOutput() {
        FileOutputStream fos;
        try {
            fos = new FileOutputStream(FICHIER_LISTE_TRANSPORT);
            ObjectOutput = new ObjectOutputStream(fos);
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            System.out.println("Impossible d'ouvrir le fichier "
                    + FICHIER_LISTE_TRANSPORT);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        FileOutputStream fos2;
        try {
            fos2 = new FileOutputStream(FICHIER_LISTE_TRAJET);
            ObjectOutput2 = new ObjectOutputStream(fos2);
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            System.out.println("Impossible d'ouvrir le fichier "
                    + FICHIER_LISTE_TRAJET);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        FileOutputStream fos3;
        try {
            fos3 = new FileOutputStream(FICHIER_LISTE_RESERVATION);
            ObjectOutput3 = new ObjectOutputStream(fos3);
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            System.out.println("Impossible d'ouvrir le fichier "
                    + FICHIER_LISTE_RESERVATION);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public void initFichier() {
        File monFichier = new File(FICHIER_LISTE_TRANSPORT);
        if (!monFichier.exists()) {
            try {
                monFichier.createNewFile(); // Cette fonction doit être appelée
                                            // au sein d'un bloc TRY
            } catch (IOException e) {
                System.out.println("Impossible de créer le fichier");
            }
        }
        File monFichier2 = new File(FICHIER_LISTE_TRAJET);
        if (!monFichier2.exists()) {
            try {
                monFichier2.createNewFile(); // Cette fonction doit être appelée
                                             // au sein d'un bloc TRY
            } catch (IOException e) {
                System.out.println("Impossible de créer le fichier");
            }
        }
        File monFichier3 = new File(FICHIER_LISTE_RESERVATION);
        if (!monFichier3.exists()) {
            try {
                monFichier3.createNewFile(); // Cette fonction doit être appelée
                                             // au sein d'un bloc TRY
            } catch (IOException e) {
                System.out.println("Impossible de créer le fichier");
            }
        }
    }

    public void reset() {
        File monFichier = new File(FICHIER_LISTE_TRANSPORT);
        if (monFichier.exists()) {
            monFichier.delete();
        }
        File monFichier2 = new File(FICHIER_LISTE_TRAJET);
        if (monFichier2.exists()) {
            monFichier2.delete();
        }
        File monFichier3 = new File(FICHIER_LISTE_RESERVATION);
        if (!monFichier3.exists()) {
            monFichier3.delete();
        }
        initFichier();
    }

    /**
     * initialise les lectures fichiers
     * 
     * @param return
     */
    public void initInput() {
        initFichier();
        FileInputStream fis;
        try {
            fis = new FileInputStream(FICHIER_LISTE_TRANSPORT);
            ObjectInput = new ObjectInputStream(fis);
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            System.out.println("Impossible d'ouvrir le fichier "
                    + FICHIER_LISTE_TRANSPORT);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        FileInputStream fis2;
        try {
            fis2 = new FileInputStream(FICHIER_LISTE_TRAJET);
            ObjectInput2 = new ObjectInputStream(fis2);
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            System.out.println("Impossible d'ouvrir le fichier "
                    + FICHIER_LISTE_TRAJET);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        FileInputStream fis3;
        try {
            fis3 = new FileInputStream(FICHIER_LISTE_RESERVATION);
            ObjectInput3 = new ObjectInputStream(fis3);
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            System.out.println("Impossible d'ouvrir le fichier "
                    + FICHIER_LISTE_RESERVATION);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    /**
     * ferme les fichiers et appel les methodes pour sauvegarder les donnees
     * 
     * @param ListeTransport
     * @param ListeTrajet
     * @param ListeReservation
     *            return
     */
    public void close(ArrayList<Transport> ListeTransport,
            ArrayList<Trajet> ListeTrajet,
            ArrayList<Reservation> ListeReservation) {
        try {
            serializeListe(ListeTransport, ListeTrajet, ListeReservation);
            ObjectOutput.close();
            ObjectInput.close();
            ObjectOutput2.close();
            ObjectInput2.close();
            ObjectOutput3.close();
            ObjectInput3.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * sauvegarde tout les transports/trajets/reservations dans les fichiers
     * 
     * @param ListeTransport
     * @param ListeTrajet
     * @param ListeReservation
     * @return
     */
    public void serializeListe(ArrayList<Transport> ListeTransport,
            ArrayList<Trajet> ListeTrajet,
            ArrayList<Reservation> ListeReservation) {
        initOutput();
        reset();
        try {
            ObjectOutput.writeObject(ListeTransport);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        try {
            ObjectOutput2.writeObject(ListeTrajet);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        try {
            ObjectOutput3.writeObject(ListeReservation);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    /**
     * Recupere tout les transports contenue dans le fichier et les rend sous
     * forme de liste
     * 
     * @param
     * @return ArrayList<Transport>
     */
    public ArrayList<Transport> fillOutListeTransport() {
        ArrayList<Transport> ListeTransport = new ArrayList<Transport>();
        try {
            if (ObjectInput.available() >= 0) {
                try {
                    ListeTransport = (ArrayList<Transport>) ObjectInput
                            .readObject();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (ClassNotFoundException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return ListeTransport;
    }

    /**
     * Recupere tout les trajets contenue dans le fichier et les rend sous forme
     * de liste
     * 
     * @param
     * @return ArrayList<Trajet>
     */
    public ArrayList<Trajet> fillOutListeTrajet() {
        ArrayList<Trajet> ListeTrajet = new ArrayList<Trajet>();
        try {
            if (ObjectInput2.available() >= 0) {
                try {
                    ListeTrajet = (ArrayList<Trajet>) ObjectInput2.readObject();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (ClassNotFoundException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return ListeTrajet;
    }

    /**
     * Recupere toute les reservations contenue dans le fichier et les rend sous
     * forme de liste
     * 
     * @param
     * @return ArrayList<Reservation>
     */
    public ArrayList<Reservation> fillOutListeReservation() {
        ArrayList<Reservation> listeReservation = new ArrayList<Reservation>();
        try {
            if (ObjectInput3.available() >= 0) {
                try {
                    listeReservation = (ArrayList<Reservation>) ObjectInput3
                            .readObject();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (ClassNotFoundException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return listeReservation;
    }
}
